import org.apache.spark.{SparkConf, SparkContext}

// 在Scala编程语言中，class和object是两个基本的构建块，它们在定义和实例化对象时扮演着不同的角色。
// class是一个蓝图，用于创建具体的对象实例，它定义了对象的属性和行为。
// 而object在Scala中用于实现单例模式，它本身就是一个实例，通常用于存放静态成员和静态方法。
object TransMapReduce {
  def test(sc: SparkContext): Unit = {
    var rdd = sc.parallelize(1.toLong to 1000000000.toLong)
    var rdd2 = rdd.map(i=>(i%4, i))
    
    var sum0 = rdd2.filter(_._1 == 0).reduce((a, b)=>(0, a._2 + b._2))
    var sum1 = rdd2.filter(_._1 == 1).reduce((a, b)=>(1, a._2 + b._2))
    var sum2 = rdd2.filter(_._1 == 2).reduce((a, b)=>(2, a._2 + b._2))
    var sum3 = rdd2.filter(_._1 == 3).reduce((a, b)=>(3, a._2 + b._2))
    
    println(sum0)
    println(sum1)
    println(sum2)
    println(sum3)
    println("==================Finished==================")
  }
  
  def main(args: Array[String]): Unit = {
    var conf = new SparkConf().setAppName("TransMapReduce").setMaster("local[*]")  
    // 注意：提交集群运行需要删除setMaster("local[*]")
    var sc = new SparkContext(conf)
    test(sc)
    sc.stop()
  }
}

// 直接运行：设build.sbt所在目录为D:\github\spark-scala-tutorial\TransMapReduce
// cd D:\github\spark-scala-tutorial\TransMapReduce
// sbt run
// 或者打包后运行
// cd D:\github\spark-scala-tutorial\TransMapReduce
// sbt package 
// spark-submit --class TransMapReduce D:\github\spark-scala-tutorial\TransMapReduce\target\scala-2.12\xxxxxxxxxxxxxxxxxxx.jar